/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.magri.modulo2.agenda.dao;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import org.magri.mvc.persistence.DBUtil;
import org.magri.mvc.persistence.DBConnection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.magri.modulo2.agenda.bean.Cidade;
import org.magri.mvc.modelo.AbstractBean;
import org.magri.mvc.persistence.AbstractDAO;
import org.magri.mvc.annotation.Bean;
import org.magri.mvc.annotation.BeanField;

/**
 *
 * @author Magri
 */
public class CidadeDAO extends AbstractDAO {

    
    public CidadeDAO() {
        super();
    }
    
    private Integer newId() throws SQLException {
        String sql = "select nextval('seq_cidade') as new";
        java.sql.ResultSet rs = dbConnection.getConnection().createStatement().executeQuery(sql);

        try {
            if (rs.next()) {
                return new Integer(rs.getInt("new"));
            } 
        } catch (Exception e) {
            Logger.getLogger(CidadeDAO.class.getName()).log(Level.SEVERE, null, e);
        } finally {
            DBUtil.close(rs, null);
        }
            
        
        
        return null;
    } 
    
    
    @Override 
    public boolean insert(AbstractBean cidade) {
        
        
        String sql = "insert into cidade (id, nome, uf) values (?, ?, ?)";
        
        PreparedStatement ps = null;
        java.sql.ResultSet rs = null;
        try {
            ps = dbConnection.getConnection().prepareStatement(sql);
            
            ps.setInt(1, newId());
            ps.setString(2, ((Cidade)cidade).getNome());
            ps.setString(3, ((Cidade)cidade).getUf());
            
            
            rs = ps.executeQuery();
            
            cidade.setId(newId());
            
            return true;

            
        } catch (SQLException ex) {
            Logger.getLogger(CidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            DBUtil.close(rs, ps);
        }
        
        return true;
    }
    
    public boolean update(Cidade cidade) {
        String sql = "update cidade set nome = ?, uf = ? where id = ?";
        PreparedStatement ps = null;
        try {
            ps = dbConnection.getConnection().prepareStatement(sql);
            
            ps.setString(1, cidade.getNome());
            ps.setString(2, cidade.getUf());
            ps.setInt(3, cidade.getId());
            
            if (ps.executeUpdate() > 0) {
                return true;
            }

            
        } catch (SQLException ex) {
            Logger.getLogger(CidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            DBUtil.close(null, ps);
        }
        
        return true;
    }
    
    public boolean delete(Cidade cidade) {
        String sql = "delete from cidade where id = ?";
        PreparedStatement ps = null;
        try {
            ps = dbConnection.getConnection().prepareStatement(sql);
            
            ps.setInt(1, cidade.getId());
            
            if (ps.executeUpdate() > 0) {
                return true;
            }

        } catch (SQLException ex) {
            Logger.getLogger(CidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            DBUtil.close(null, ps);
        }
        
        return true;
    }
    
    public Cidade consultaID(AbstractBean bean) {
        String sql = "select * from cidade where id = ?";
        PreparedStatement ps = null;
        ResultSet rs;
        
        try {
            ps = dbConnection.getConnection().prepareStatement(sql);
            
            ps.setInt(1, bean.getId());
            rs = ps.executeQuery();
            
            if (rs.next()) {
                Cidade cidade = new Cidade();
                
                cidade.setId(rs.getInt("ID"));
                cidade.set("Nome", rs.getString("NOME"));
                cidade.setUf(rs.getString("UF"));
                
                return cidade;
            }

            
        } catch (SQLException ex) {
            Logger.getLogger(CidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            DBUtil.close(null, ps);
        }
        
        return null;
    }
    
    public String getSqlPesquisa() {
        String sql =
                "select id as \"ID\",\n"
                + "     nome as \"Nome\",\n"
                + "     uf as \"UF\"\n"
                + "  from cidade\n"
                + " where upper(nome || '%' || uf || '%' || nome) like upper(?)\n"
                + " order by nome";
        
        return sql;
    }

    public static void main(String[] args) {
        CidadeDAO cidadeDAO = new CidadeDAO();
        
        Cidade city = new Cidade();
        city.setNome("Cascavel");
        city.setUf("PR");
        
        cidadeDAO.insert(city);
        
        city = new Cidade();
        city.setNome("Vera Cruz do Oeste");
        city.setUf("PR");
        
        cidadeDAO.insert(city);
    }

}
